package es.uca.plii.warrenl0;

import java.util.Map;

/***
 * Interfaz para la clase Nodo. Con él construiremos el árbol sintáctico para
 * representar a la expresión en lenguaje L0.
 * Determina todas las operaciones báscias que los
 * nodos pueden realizar y los distintos tipos de nodos posibles.
 * @author Rafael Sánchez, Alfonso Sendra
 */
public interface Nodo {

     public final static int NODOEXPRESION = 1001;
     public final static int NODOPROGRAM = 1002;
     public final static int NODOQUERY = 1003;
     public final static int NODOTERMINO = 1004;
     public final static int NODOESTRUCTURA = 1005;
     public final static int NODOVARIABLE = 1006;

     /**
      * Devuelve el tipo de nodo concreto que se está implementando
      * @return el tipo de nodo concreto que se está implementando
      */
     public int getTipo();

     /**
      * Asigna un número al nodo. Nosotros le vamos asignar su orden en un
      * recorrido en anchura del árbol en el que se encuentra
      * @param numero el número a asignar
      */
      public void setNumero(Integer numero);

      /**
       * Devuelve el número asignado al nodo
       * @return el número asignado
       */
      public Integer getNumero();

      /**
       * Devuelve la profundidad asignado al nodo
       * @return la profundidad asignado
       */
      public Integer getProfundidad();

      /**
       * Asigna una profundidad al nodo. Nosotros le vamos asignar la profundidad
       * en la que se encuentra en el árbol
       * @param profundidad la profundidad a asignar
       */
      public void setProfundidad(Integer profundidad);

      /**
       * Recorrido recursivo del árbol donde se le asigna la profundidad
       * a cada nodo
       * @param profundidad la profundidad del nodo padre
       * @param extractorProfundidades
       */
      public void numerarProfundidades(int profundidad, ExtractorProfundidades extractorProfundidades);

      /**
       * Devuelve la representación aplanada (flattened) del nodo
       * @return la representación aplanada
       */
      public String flattenedForm();

      /**
       * Recorrido recursivo del árbol para obtener su representación
       * aplanada (flattened)
       * @param flt el mapa donde se va a guardar esa representación aplanada
       */
      public void obtenerFlattenedForms(Map<Integer,String> flt);

      /**
       * Recorrido recursivo del árbol para obtener su representación
       * tokenizada
       * @param flt el mapa donde se va a guardar esa representación tokenizada
       */
      public void obtenerTokenizedForms(Map<Integer,String> flt);

      /**
       * Recorrido recursivo del árbol para obtener su representación
       * en instrucciones M0
       * @param flt el mapa donde se va a guardar esa representación
       * en instrucciones M0
       */
      public void obtenerInstructions(Map<Integer,CompInstruccion> flt);

}
